package com.yuhuihui.common.utils;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * LocalDate工具类
 * @author yuhh
 * @date 2020-03-02 15:42
 **/
public final class LocalDateUtil {

    /**
     * 时间格式: yyyy-MM-dd
     */
    public final static String DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 时间格式: yyyy-MM
     */
    public final static String MONTH_FORMAT = "yyyy-MM";

    /**
     * 时间格式: yyyy-MM-dd HH:mm:ss
     */
    public final static String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 时间格式: HH:mm
     */
    public final static String HOUR_MINUTE_FORMAT = "HH:mm";

    /**
     * 时间格式：HH:mm:ss
     */
    public final static String HOUR_MINUTE_SECOND_FORMAT = "HH:mm:ss";

    /**
     * 时间格式: yyyy年MM月dd日
     */
    public final static String DATE_FORMAT_CN = "yyyy年MM月dd日";

    /**
     * 时间格式: yyyy年MM月dd日 HH:mm:ss
     */
    public final static String DATE_TIME_FORMAT_CN = "yyyy年MM月dd日 HH:mm:ss";

    /**
     * 时间格式: yyyyMMdd
     */
    public final static String DATE_FORMAT_UNSIGNED = "yyyyMMdd";

    /**
     * 时间格式: yyyyMMddHHmmss
     */
    public final static String DATE_TIME_FORMAT_UNSIGNED = "yyyyMMddHHmmss";

    /**
     * 时间格式: HHmmss
     */
    public final static String TIME_FORMAT_UNSIGNED = "HHmmss";

    /**
     * 返回指定格式的时间字符串
     *
     * @param currDate 需要格式化的时间
     * @param format   格式化后的时间格式
     * @return {@link String } 格式化后的时间字符串
     * @author yuhh
     * @date 2023-05-25 14:21:35
     */
    public static String getFormatDate(Date currDate, String format) {
        return new SimpleDateFormat(format).format(currDate);
    }

    /**
     * 返回yyyy-MM-dd格式的时间字符串
     *
     * @param currDate 需要格式化的时间
     * @return {@link String } 格式化后的时间字符串
     * @author yuhh
     * @date 2023-05-25 14:21:40
     */
    public static String getFormatDate(Date currDate) {
        return getFormatDate(currDate, DATE_FORMAT);
    }

    /**
     * 返回yyyy-MM-dd HH:mm:ss格式的时间字符串
     *
     * @param currDate 需要格式化的时间
     * @return {@link String } 格式化后的时间字符串
     * @author yuhh
     * @date 2023-05-25 14:21:51
     */
    public static String getFormatDateTime(Date currDate) {
        return getFormatDate(currDate, DATE_TIME_FORMAT);
    }

    /**
     * 获取当前年份
     *
     * @return int 当前年份
     * @author yuhh
     * @date 2023-05-25 14:22:08
     */
    public static int getNowYear() {
        return LocalDate.now().getYear();
    }

    /**
     * 获取指定时间的年份，yyyy-mm-dd格式
     *
     * @param date 指定时间
     * @return int 指定时间的年份
     * @author yuhh
     * @date 2023-05-25 14:22:32
     */
    public static int getYear(String date) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return localDate.getYear();
    }

    /**
     * 获取当前月份
     *
     * @return int 当前月份
     * @author yuhh
     * @date 2023-05-25 14:22:08
     */
    public static int getNowMonth() {
        return LocalDate.now().getMonthValue();
    }

    /**
     * 获取指定时间的月份，yyyy-mm-dd格式
     *
     * @param date 指定时间
     * @return int 指定时间的月份
     * @author yuhh
     * @date 2023-05-25 14:22:24
     */
    public static int getMonth(String date) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return localDate.getMonthValue();
    }

    /**
     * 获取当前日期
     *
     * @return int 当前日期
     * @author yuhh
     * @date 2023-05-25 14:22:13
     */
    public static int getNowDay() {
        return LocalDate.now().getDayOfMonth();
    }

    /**
     * 获取指定时间的日期，yyyy-mm-dd格式
     *
     * @param date 指定时间
     * @return int 指定时间的日期
     * @author yuhh
     * @date 2023-05-25 14:22:24
     */
    public static int getDay(String date) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return localDate.getDayOfMonth();
    }

    /**
     * 获取指定日期所在月的最大天数，yyyy-mm-dd
     *
     * @param date 指定时间
     * @return int 最大天数
     * @author yuhh
     * @date 2023-05-25 14:24:22
     */
    public static int getMonthMaxDay(String date) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return localDate.lengthOfMonth();
    }

    /**
     * 获取指定日期的上个月日期，yyyy-mm-dd
     *
     * @param date 指定时间
     * @return {@link String } 上个月日期，yyyy-mm-dd
     * @author yuhh
     * @date 2023-05-25 14:24:32
     */
    public static String getLastMonthDate(String date) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return localDate.minusMonths(1L).format(DateTimeFormatter.ofPattern(DATE_FORMAT));
    }

    /**
     * 获取增加指定分后的时间
     *
     * @param plusMinutes 增加分的值
     * @return {@link Date } 增加指定分后的时间
     * @author yuhh
     * @date 2023-05-25 14:24:43
     */
    public static Date getDatePlusMinutes(int plusMinutes) {
        return Date.from(LocalDateTime.now().plusMinutes(plusMinutes).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取指定日期增加指定分后的时间
     *
     * @param date        指定日期，格式为：yyyy-MM-dd HH:mm:ss
     * @param plusMinutes 增加分的值
     * @return {@link Date } 增加指定分后的时间
     * @author yuhh
     * @date 2023-05-25 14:32:00
     */
    public static Date getDatePlusMinutes(String date, long plusMinutes) {
        LocalDateTime localDateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DATE_TIME_FORMAT));
        return Date.from(localDateTime.plusMinutes(plusMinutes).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取增加指定天数后的时间
     *
     * @param plusDays 增加天的值
     * @return {@link Date } 增加指定天后的时间
     * @author yuhh
     * @date 2023-05-25 14:24:51
     */
    public static Date getDatePlusDays(int plusDays) {
        return Date.from(LocalDate.now().plusDays(plusDays).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取指定日期增加指定天数后的时间
     *
     * @param date     指定日期，格式为：yyyy-MM-dd
     * @param plusDays 增加天的值
     * @return {@link Date } 增加指定天后的时间
     * @author yuhh
     * @date 2023-05-25 14:30:16
     */
    public static Date getDatePlusDays(String date, long plusDays) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return Date.from(localDate.plusDays(plusDays).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取增加指定月后的时间
     *
     * @param plusMonths 增加月的值
     * @return {@link Date } 增加指定月后的时间
     * @author yuhh
     * @date 2022-05-12 15:35:02
     */
    public static Date getDatePlusMonths(int plusMonths) {
        return Date.from(LocalDate.now().plusMonths(plusMonths).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获取指定日期增加指定月后的时间
     *
     * @param date       指定日期，格式为：yyyy-MM-dd
     * @param plusMonths 增加指定月后的时间
     * @return {@link Date }
     * @author yuhh
     * @date 2023-05-25 14:35:15
     */
    public static Date getDatePlusMonths(String date, long plusMonths) {
        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern(DATE_FORMAT));
        return Date.from(localDate.plusMonths(plusMonths).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    private LocalDateUtil(){

    }
}
